package com.cty.Repository;

import com.cty.pojo.User;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

public interface UserRepository extends JpaRepository<User,Long> {

    //在这个接口里面可以定义一些方法来选择性操作（不用写sql语句 框架会自动提供）
    User findByUserName(String UserName);


    //and的使用
    User findByUserNameAndPassword(String userName,String password);

    //or的使用
    List<User> findByUserNameOrPassword(String userName,String password);

    //isNUll的使用
    List<User> findByUserNameIsNull();


    //分页查询的使用
    Page<User> findAllByUserName(String userName, Pageable pageable);

    // DTO的使用
    UserPassword findByPassword(String number);


    /*
    * @Query注解的用法
    *
    * 不仅可以查询 而且还可以 增删改
    *
    * 第一种方式
    * 操作对象获取sql
    *
    * 第二种方式
    * 原生sql
    *
    * 传参的方式
    * ?1 ?2 代表第几个参数
    *
    * Parma(参数名)
    * sql语句中 :参数名
    * */
    //操作对象 第一种传参方式
    @Query("from User where id = ?1")
    User selectById1(Long id);

    //操作对象第二种传参方式
    @Query("from User where id = :id")
    User selectById2(@Param(value = "id") Long id);

    //原生sql 要开启原生sql
    @Query(value = "select id,user_name,password from t_user where id = ?1",nativeQuery = true)
    User selectById3(Long id);

    // 要开启原生sql
    @Query(value = "select id,user_name,password from t_user where id = :id",nativeQuery = true)
    User selectById4(@Param(value = "id") Long id);

    @Query("from User ")
    //查询多条数据
    List<User> selectAll();

    @Transactional
    @Modifying
    @Query(value = "insert into t_user(user_name,password) values(?1,?2)",nativeQuery = true)
    //插入数据 也可以指定parma参数
    void insert(String userName,String password);


    @Transactional
    @Modifying
    //修改数据 也可以指定parma参数
    @Query(value = "update t_user set user_name=?1,password=?2 where id = ?3",nativeQuery = true)
    void update(String userName,String password,Long id);

    @Transactional
    @Modifying
    //删除数据 也可以用parma数据
    @Query(value = "delete from t_user where id = ?1",nativeQuery = true)
    void delById(Long id);

    //排序
    @Query("from User order by ?1 desc ")
    List<User> selectAllOrder(String col);

    //排序传入对象的形式
    @Query("from User ")
    List<User> selectAllOrder2(Sort sort);

    //排序传入对象形式 Object[] 数组接收表示 DTO的形式
    @Query("select u.id,length(u.userName) from User u")
    //第二种方式
    List<Object []> selectIdAndUserNameLength(Sort sort);

    @Query("from User ")
    Page<User> selectAllPage(Pageable pageable);

    @Query("select u.id as id,length(u.userName) as userNameLen from User u")
    List<UserDTO> selectUserNameLenAndId();

    //条件查询
    // 对象的方式
    @Query("select u from User u where (?1 is null or u.userName = ?1) and (?2 is null or u.password = ?2)")
    User selectIf(String userName, String password);

    // 条件查询
    //原生sql方式
    @Query(value = "select * from t_user where (?1 is null or user_name = ?1) and (?2 is null or  password = ?2)",nativeQuery = true)
    User selectIf2(String userName,String password);
}
